package com.gitee.ed.arithmetic.leetcode.question.question_1_100.question_1_10;

import com.gitee.ed.arithmetic.leetcode.SolutionRunner;
import com.gitee.ed.arithmetic.leetcode.common.Question;
import com.gitee.ed.arithmetic.leetcode.solution.solution_1_100.solution_1_10.Solution8;

/**
 * @author hongda.li
 */
public class Question8 implements Question<Solution8> {
    @Override
    public String link() {
        return "https://leetcode.cn/problems/string-to-integer-atoi/description/";
    }

    @Override
    public String title() {
        return "8.字符串转换整数";
    }

    @Override
    public String description() {
        return """
                请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数（类似 C/C++ 中的 atoi 函数）。
                函数 myAtoi(string s) 的算法如下：
                1.读入字符串并丢弃无用的前导空格
                2.检查下一个字符（假设还未到字符末尾）为正还是负号，读取该字符（如果有）。 确定最终结果是负数还是正数。 如果两者都不存在，则假定结果为正。
                3.读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
                4.将前面步骤读入的这些数字转换为整数（即，"123" -> 123， "0032" -> 32）。如果没有读入数字，则整数为 0 。必要时更改符号（从步骤 2 开始）。
                5.如果整数数超过 32 位有符号整数范围 ，需要截断这个整数，使其保持在这个范围内。
                6.返回整数作为最终结果。
                """;
    }

    @Override
    public void test(Solution8 solution) {
        this.test1(solution);

        this.test2(solution);

        this.test3(solution);
    }

    private void test1(Solution8 solution) {
        SolutionRunner.checkString(-2147483648, solution.myAtoi("-91283472332"));
    }

    private void test2(Solution8 solution) {
        SolutionRunner.checkString(-42, solution.myAtoi("    -42"));
    }

    private void test3(Solution8 solution) {
        SolutionRunner.checkString(4193, solution.myAtoi("4193 with words"));
    }
}
